package com.luxsoft.siipap.em.replica.online;

import java.util.Date;


import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;
import org.springframework.beans.BeanUtils;

import com.luxsoft.siipap.em.replica.model.Registro;
import com.luxsoft.siipap.em.replica.model.Registro.Tipo;
import com.luxsoft.siipap.model.Direccion;
import com.luxsoft.siipap.model.core.Cliente;
import com.luxsoft.siipap.model.core.Contacto;

import com.luxsoft.siipap.service.core.ClienteManager;
import com.luxsoft.siipap.util.ValidationUtils;

/**
 * Importa clientes haciendo uso de la infraestructura de replicacion
 * de SIIPAP
 *  
 * @author Ruben Cancino
 *
 */
public class OnlineImporter_Clientes implements ImportadorOnLine{
	
	protected Logger logger=Logger.getLogger(getClass());
	
	private ClienteManager clienteManager;

	public Object importar(Registro r) {		
		if (r.getArchivo().startsWith("CLIENTES")) {
			if(r.getOrigen().startsWith("03312959")){
				System.out.println("DEBUG");
			}
			if(r.getTipo().equals(Tipo.CAMBIO)){
				logger.info("Actuilizando cliente con "+r);				
				actualizar(r);
			}else if(r.getTipo().equals(Tipo.ALTA)){
				Cliente res= generar(r);
				try {
					Cliente existente=getClienteManager().buscarPorClave(res.getClave());
					if(existente!=null){
						BeanUtils.copyProperties(existente, res,new String[]{"id","version"});
						res=getClienteManager().save(existente);
					}else{
						res=getClienteManager().save(res);
					}
					logger.info("Cliente nuevo: "+res);
					return res;
				} catch (Exception e) {
					ValidationUtils.debugValidation(res);
					logger.error(e);
					return null;
				}
			}
			
		}
		return null;
	}
	
	/**
	 * En caso de cliente ya existente actualiza los datos del registro
	 * 
	 * @param target
	 * @param r
	 */
	private void actualizar(Registro r){
		String CLICLAVE=r.getLlave();
		if(StringUtils.isBlank(CLICLAVE)){
			logger.info("Imposible actualizar un cliente sin la clave reg: "+r);
			return;
		}
		
		Cliente target=getClienteManager().buscarPorClave(CLICLAVE);
		
		Cliente clone=generar(r);
		
		String CLINOMBRE=r.getString("CLINOMBRE");
		if(!StringUtils.isBlank(CLINOMBRE)){
			target.setNombre(CLINOMBRE);
		}
		if(target.getDireccionFiscal()==null){
			target.setDireccionFiscal(clone.getDireccionFiscal());
		}else{
			String CLICALLE=r.getString("CLICALLE");
			if(!StringUtils.isBlank(CLICALLE)){
				target.getDireccionFiscal().setCalle(CLICALLE);
			}
			String CLICOLON=r.getString("CLICOLON");
			if(!StringUtils.isBlank(CLICOLON)){
				target.getDireccionFiscal().setColonia(CLICOLON);
			}
			String CLIDELEG=r.getString("CLIDELEG");
			if(!StringUtils.isBlank(CLIDELEG)){
				target.getDireccionFiscal().setMunicipio(CLIDELEG);
			}
			String CLIPOSTAL=r.getString("CLIPOSTAL");
			if(!StringUtils.isBlank(CLIPOSTAL)){
				target.getDireccionFiscal().setCp(CLIPOSTAL);
			}
			
		}
		
		
		String CLITEL1=r.getString("CLITEL1");
		if(!StringUtils.isBlank(CLITEL1)){
			target.agregarTelefono("Tel 1", CLITEL1);
		}
		
		String CLIFAX=r.getString("CLIFAX");
		if(!StringUtils.isBlank(CLIFAX)){
			target.agregarTelefono("Fax 1", CLIFAX);
		}
		
		String CLIRFC=r.getString("CLIRFC");
		if(!StringUtils.isBlank(CLIRFC)){
			target.setRfc(CLIRFC);
		}
		
		String CLICUENTA=r.getString("CLICUENTA");
		if(!StringUtils.isBlank(CLICUENTA)){
			target.setCuentaContable(CLICUENTA);
		}
		
		String CLIOBSCLAS=r.getString("CLIOBSCLAS");
		if(!StringUtils.isBlank(CLIOBSCLAS)){
			target.agregarComentario("Comentario 1", CLIOBSCLAS);
		}
		
		//Pendientes
		//String CLIGERGRAL=r.getString("CLIGERGRAL");	
		//String CLIGERCOMP=r.getString("CLIGERCOMP");
		target=getClienteManager().save(target);
		logger.info("Cliente actualizado: "+target);
	}
	
	
	
	private Cliente generar(final Registro r){		
		String CLICLAVE=r.getString("CLICLAVE");
		
		String CLINOMBRE=r.getString("CLINOMBRE");
		String CLICALLE=r.getString("CLICALLE");
		String CLICOLON=r.getString("CLICOLON");
		String CLIDELEG=r.getString("CLIDELEG");
		String CLIPOSTAL=r.getString("CLIPOSTAL");
		String CLITEL1=r.getString("CLITEL1");
		String CLIFAX=r.getString("CLIFAX");
		String CLIRFC=r.getString("CLIRFC");
		String CLICUENTA=r.getString("CLICUENTA");
		String CLIOBSCLAS=r.getString("CLIOBSCLAS");
		String CLIGERGRAL=r.getString("CLIGERGRAL");
		String CLIGERCOMP=r.getString("CLIGERCOMP");
		
		String CLICLAVORI=r.getString("CLICLAVORI");
		Number CLIREVISIO=r.getNumber("CLIREVISIO");
		Number CLIPAGO=r.getNumber("CLIPAGO");
		Number CLICOBRADO=r.getNumber("CLICOBRADO");
		Number CLIAGENTE=r.getNumber("CLIAGENTE");
		Number CLILIMITE=r.getNumber("CLILIMITE");
		Date CLIFECREAL=r.getDate("CLIFECREAL");
		Date CLIFECSIAL=r.getDate("CLIFECSIAL");
		Date CLISUSPEN=r.getDate("CLISUSPEN");
		String CLICOMSUS=r.getString("CLICOMSUS");
		String CLIOBSGRAL=r.getString("CLIOBSGRAL");		
		Number CLICLASIFI=r.getNumber("CLICLASIFI");
		Date CLIFECLASI=r.getDate("CLIFECLASI");		
		String CLICEDULA=r.getString("CLICEDULA");
		Number CLIPLAZO=r.getNumber("CLIPLAZO");
		String CLITIPVTO=r.getString("CLITIPVTO");
		String CLIPAGARE=r.getString("CLIPAGARE");
		String CLIOPEDEPU=r.getString("CLIOPEDEPU");
		Date CLIFECDEPU=r.getDate("CLIFECDEPU");
		Number CLIBACOCO=r.getNumber("CLIBACOCO");
		Number CLIBACOVE=r.getNumber("CLIBACOVE");
		String CLIESLIDER=r.getString("CLIESLIDER");
		String CLILIDER=r.getString("CLILIDER");
		String CLIESTADO=r.getString("CLIESTADO");
		String CLICOMEDO=r.getString("CLICOMEDO");
		String CLICOTIZA=r.getString("CLICOTIZA");
		String CLICOMCOT=r.getString("CLICOMCOT");
		String CLIPEDIDO=r.getString("CLIPEDIDO");
		String CLICOMPED=r.getString("CLICOMPED");
		String CLIFACTUR=r.getString("CLIFACTUR");
		String CLICOMFAC=r.getString("CLICOMFAC");
		Number CLIPORCDES=r.getNumber("CLIPORCDES");
		Number CLIPORCDE2=r.getNumber("CLIPORCDE2");
		String CLITIPO=r.getString("CLITIPO");
		String CLICTRLGRA=r.getString("CLICTRLGRA");
		String CLIFORPAGO=r.getString("CLIFORPAGO");
		String CLIMOIMPNI=r.getString("CLIMOIMPNI");
		Number CLIABOGADO=r.getNumber("CLIABOGADO");
		Date CLIFEASIAB=r.getDate("CLIFEASIAB");
		Number CLIOPERADO=r.getNumber("CLIOPERADO");
		Number CLIUSUAR=r.getNumber("CLIUSUAR");
		Number CLIBACOVC=r.getNumber("CLIBACOVC");
		Date CLIFATENCL=r.getDate("CLIFATENCL");
		Date CLIFATENMO=r.getDate("CLIFATENMO");
		String CLIAATENCL=r.getString("CLIAATENCL");
		String CLIAATENMO=r.getString("CLIAATENMO");
		String CLIEMAIL=r.getString("CLIEMAIL");
		String CLITELANT=r.getString("CLITELANT");
		String CLIFAXANT=r.getString("CLIFAXANT");
		String CLIGIROEMP=r.getString("CLIGIROEMP");
		String CLIMANUAL=r.getString("CLIMANUAL");
		String CLILIPRCRE=r.getString("CLILIPRCRE");
		Date CLIALPRCRE=r.getDate("CLIALPRCRE");
		String CLILIPRCON=r.getString("CLILIPRCON");
		Date CLIALPRCON=r.getDate("CLIALPRCON");
		String CLIEQUIORG=r.getString("CLIEQUIORG");
		String CLIHORAREG=r.getString("CLIHORAREG");
		String CLIACCES=r.getString("CLIACCES");
		String CLIVERSION=r.getString("CLIVERSION");

		Cliente c=new Cliente();
		c.setClave(CLICLAVE);
		c.setNombre(CLINOMBRE);
		c.setRfc(CLIRFC);
		c.setCuentaContable(CLICUENTA);
		Direccion d=new Direccion();
		d.setCalle(CLICALLE);
		d.setCiudad("");
		d.setColonia(CLICOLON);
		d.setCp(CLIPOSTAL);
		d.setEstado(CLIESTADO);
		d.setMunicipio(CLIDELEG);
		d.setNumero("");
		
		c.setDireccionFiscal(d);
		c.agregarTelefono("Tel 1", CLITEL1);
		c.agregarTelefono("Fax 1", CLIFAX);
		c.setEmail(CLIEMAIL);
		if(!StringUtils.isBlank(CLIGERGRAL)){
			Contacto con=new Contacto(CLIGERGRAL,"Gerente general");
			c.agregarContacto(con);
		}
		if(!StringUtils.isBlank(CLIGERCOMP)){
			Contacto con=new Contacto(CLIGERCOMP,"Gerente compras");
			c.agregarContacto(con);
		}
		if(!StringUtils.isBlank(CLIOBSCLAS))
			c.agregarComentario("Comentario 1", CLIOBSCLAS);		
		return c;
	}
	
	

	public ClienteManager getClienteManager() {
		return clienteManager;
	}

	public void setClienteManager(ClienteManager clienteManager) {
		this.clienteManager = clienteManager;
	}
	
	

}
